#include <head.h>

// 定义车库上限
#define MAX_CAR_LIMIT 5
int arr_len = 0;

// 定义信号量
sem_t sem;
// 定义互斥锁
pthread_mutex_t mutex;

// 声明线程函数
void *sem_func(void *val); // 车辆进入车库
void *sem_root(void *val); // 管理车库状态

int main(int argc, char const *argv[])
{
    // 定义线程 tid 以及 id
    pthread_t Tid[11];
    int ID_arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 线程内部使用 展示自己是几号线程
    int __errnum;
    // 初始化信号
    sem_init(&sem, 0, 3); // 设置停车场 , 0------ 线程同步     ，3--------起始位置几个线程开始跑
    // 初始化锁
    pthread_mutex_init(&mutex, NULL);

    // 创建线程
    // pthread_create(&Tid[11], NULL, sem_root, NULL);

    for (int i = 0; i < 10; i++)
    {

        if (0 != (__errnum = pthread_create(&Tid[i], NULL, sem_func, (void *)&ID_arr[i])))
        {
            printf("pthread_create error: %d %s\n", __errnum, strerror(__errnum));
        }
        // 重置错误码 == 重置 系统中的 error 的值 perror 是可以直接获取的
        // 返回错误码 == 当函数出错时 返回错误码编号 strerror
    }

    // 回收线程
    for (int i = 0; i < 10; i++)
    {
        pthread_join(Tid[i], NULL);
    }

    // 销毁信号
    sem_destroy(&sem);

    return 0;
}

// 定义线程函数
void *sem_func(void *val)
{
    int id = *((int *)val);
    printf("小车 %d 等待车位.....\n", id);
    sleep(2);

    // P操作
    sem_wait(&sem);
    pthread_mutex_lock(&mutex);
    // 线程开始工作
    printf("小车 %d 开始停车***>\n", id);
    pthread_mutex_unlock(&mutex);
    sleep(3);

    pthread_mutex_lock(&mutex);
    printf("小车 %d 结束停车===>\n", id);

    pthread_mutex_unlock(&mutex);
    // V操作
    sem_post(&sem);

    return NULL;
}

// void *sem_root(void *val)
// {
//     while (1)
//     {
//         // P操作
//         sem_wait(&sem);
//         if (arr_len <= MAX_CAR_LIMIT)
//         {
//             sleep(1);
//             printf("车位还有空位： %d ��\n", MAX_CAR_LIMIT - arr_len);
//         }
//         else
//         {
//             sleep(1);
//             printf("车库已满: \n");
//             continue;
//         }

//         // v操作
//         sem_post(&sem);
//     }
// }